// 给定一个非空且只包含非负数的整数数组 nums，数组的度的定义是指数组里任一元素出现频数的最大值。
// 你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组，返回其长度。

const findShortestSubArray = function (nums: number[]): number {
    const countMap = new Map<number, number>();// 计数哈希表
    const boundMap = new Map<number, [number, number]>();// 边界哈希表
    let degree = 0;// 数组度
    let res = nums.length;// 结果变量初始化---要求最短
    // 维护哈希表
    for (let i = 0; i < nums.length; i++) {
        // 更新计数哈希表
        const currCount = countMap.get(nums[i]) ?? 0;
        countMap.set(nums[i], currCount + 1);
        // 更新度
        degree = Math.max(degree, currCount + 1);
        // 更新边界哈希表
        const currBound: [number, number] = boundMap.get(nums[i]) ?? [nums.length, 0];
        const leftBound = Math.min(currBound[0], i);
        const rightBound = Math.max(currBound[1], i);
        boundMap.set(nums[i], [leftBound, rightBound]);
    }
    // 遍历计数哈希表，根据度确定边界哈希表的key，来求最短连续子数组长度
    for (let [key, value] of countMap.entries()) {
        if (value === degree) {
            const currBound: [number, number] = boundMap.get(key) || [nums.length, 0];
            res = Math.min(res, currBound[1] - currBound[0] + 1);
        }
    }
    return res;
};

findShortestSubArray(
    [1, 2, 2, 3, 1])

// 比较经典的一道考察哈希表应用的题目
// 这里的难点是首先需要求出数组的度，度的话可以通过计数哈希表来实现
// 其次理解了题意之后，实际上这里求最短连续子数组长度涉及到找到最大计数元素
// 找到最大计数元素之后可能是不唯一的，这个时候求最短长度需要拿到最大计数元素的边界值
// 而边界值我们也可以通过边界哈希表来记录，这也是在第一遍循环中可以做的事情
// 所以整体的思路就是第一遍循环原数组，完成边界哈希表、度、计数哈希表的记录
// 之后遍历计数哈希表，根据度确定边界哈希表的key，再使用确定的边界长度来求最短连续子数组长度
